/*
 * ColaClientes.cpp
 *
 *  Created on: Nov 4, 2011
 *      Author: gonzalo
 */

#include "ColaClientes.h"
#include "../common/utils/Logger.h"
#include "../common/utils/InstanceDuplicater.h"

ColaClientes::ColaClientes() {

}

ColaClientes::~ColaClientes() {
	std::list<ConexionServer*>::iterator it = this->clientes.begin();
	while (it != this->clientes.end())
	{
		delete(*it);
		++it;
	}
}


void ColaClientes::setClient(ConexionServer* cliente){
	Logger::trace("ColaClientes", "setClient","Recibio un nuevo cliente" );
	clientes.push_back(cliente);

	signal();
}

ConexionServer* ColaClientes::getClient(){
	Logger::trace("ColaClientes", "getCliente","Pide un cliente" );


	//Si la Lista esta vacia me quedo bloqueado hasta que llegue una senial
	if (clientes.empty()) {
		wait();
	}

	ConexionServer* retorno = clientes.front();
	clientes.pop_front();

	return retorno;
}

void ColaClientes::removeClient(DTO* cliente){
	ConexionServer* aux;

	std::list<ConexionServer*>::iterator it_aux;
	for (it_aux = clientes.begin(); it_aux != clientes.end();++it_aux) {
		aux = (*it_aux);
		if(aux->getCliente() == cliente->getOwner()){
			Logger::trace("ColaClientes","removeClient","Se elimina el cliente : " + aux->getCliente());
			aux->terminar();
			clientes.remove(aux);
			//delete aux;
			return;
		}
	}
}

bool ColaClientes::isClient(std::string cliente){
	ConexionServer* aux;

	std::list<ConexionServer*>::iterator it_aux;
	for (it_aux = clientes.begin(); it_aux != clientes.end();++it_aux) {
		aux = (*it_aux);
		if(aux->getCliente() == cliente){
			return true;
		}
	}
	return false;
}

void ColaClientes::propagarDTO(DTO* dto){
	ConexionServer* aux;

	std::list<ConexionServer*>::iterator it_aux;
	for (it_aux = clientes.begin(); it_aux != clientes.end();++it_aux) {
		aux = (*it_aux);
		Logger::trace("ColaClientes","propagarDTO","Se envia mensaje A : " + aux->getCliente());

		aux->addToSend(InstanceDuplicater::duplicate(dto));
	}
}

std::list<DTOCliente*>* ColaClientes::getInvalidClients(){
	ConexionServer* aux;
	std::list<DTOCliente*>* retorno = new std::list<DTOCliente*>();

	std::list<ConexionServer*>::iterator it_aux;
	for (it_aux = clientes.begin(); it_aux != clientes.end();++it_aux) {
		aux = (*it_aux);

		if(!aux->esValida()){
			retorno->push_back(new DTOCliente(aux->getCliente(),DISCONECTED,NULL,false));
		}
	}

	return retorno;
}

int ColaClientes::getSize(){
	return this->clientes.size();
}
